#include <stdio.h>
# include "Stack.h"

// 递归：代码复用
// 打印 nums[start...end]
void printArr(int* nums, int n, int start) {
    // 退出条件
    if (start == n) return;
    // 第一步：打印 nums[start]
    printf("%d\n", nums[start]);
    // 第二步：打印 nums[start + 1...end]
    printArr(nums, n, start + 1);
}

// 迭代：显示栈模拟递归
// 空间复杂度：O(n)
void printArrIter(int* nums, int n) {
    // 定义显示栈，作用和系统栈是一样的
    ST stack;
    StackInit(&stack);
    // 第一次调用 printArr
    StackPush(&stack, 0);
    while (!StackEmpty(&stack)) {
        int start = StackTop(&stack);
        StackPop(&stack);
        // 退出条件
        if (start > n - 1) return;
        // 第一步：打印第一个元素
        printf("%d\n", nums[start]);
        // 第二步：调用 printArr，打印 [start + 1...end]
        StackPush(&stack, start + 1);
    }
}

int main(void) {
    int nums[] = {1, 2, 3, 4};
    printArr(nums, 4, 0);
    printArrIter(nums, 4);
    return 0;
}
